package server.services;

import java.util.Calendar;
import java.util.List;

import model.Usuario;
import server.dao.PenalizacionesDAO;
import server.exception.ServiceException;
import server.model.Penalizacion;


/**
 * Esta clase encapsula las acciones que pueden realizarse sobre las
 * penalizaciones. Todo aquel que desea obtener algun dato de las penalizaciones
 * persistidas deberia pedirselo a esta clase
 * 
 * @author romeroy
 * 
 */
public class PenalizacionesService {
	private static PenalizacionesDAO DAO;
	
	public PenalizacionesService(){
		if(PenalizacionesService.DAO == null)
			PenalizacionesService.DAO = new PenalizacionesDAO();
	}
	
	/**
	 * Obtiene una penalizacion identificada por id
	 * @param id Identificador de la penalizacion
	 * @return Penalizacion identificada por ID
	 * @throws Exception En caso de no poder completarse la accion
	 */
	public Penalizacion obtener(int id) throws Exception {
		return DAO.obtener(id);
	}
	
	/**
	 * Penaliza un usuario
	 * @param usuario Usuario que sera penalizado
	 * @param motivo Motivo por el cual se lo penaliza
	 * @param hastaCuando Fecha limite hasta la que se mantendra la penalizacion
	 * @return true en caso de exito, false en caso contrario
	 * @throws Exception En caso de no poder completarse la accion
	 */
	public boolean penalizar(Usuario usuario, String motivo, Calendar hastaCuando)  throws ServiceException {
//		return DAO.penalizar(usuario, motivo, hastaCuando);
		throw new ServiceException("El metodo penalizar no esta implementado");
	}
	
	/**
	 * Penaliza un usuario
	 * @param usuario Usuario que sera penalizado
	 * @param motivo Motivo por el cual se lo penaliza
	 * @param dias Cantidad de dias que se mantendra la penalizacion
	 * @return true en caso de exito, false en caso contrario
	 * @throws Exception En caso de no poder completarse la accion
	 */
	public boolean penalizar(Usuario usuario, String motivo, int dias)  throws Exception {
		return DAO.penalizar(usuario, motivo, dias);
	}
	
	/**
	 * Penaliza un usuario
	 * @param penalizacion Objeto que contiene los datos para penalizar
	 * @return true en caso de exito, false en caso contrario
	 * @throws Exception En caso de no poder completarse la accion
	 */
	public boolean penalizar(Penalizacion penalizacion)  throws Exception {
		return DAO.penalizar(penalizacion);
	}
	
	/**
	 * Obtiene una lista de todas las penalizaciones activas
	 * @return Lista de penalizaciones activas
	 * @throws Exception En caso de no poder concretarse la accion
	 */
	public List<Penalizacion> todas() throws Exception {
		return DAO.todas();
	}
	
	/**
	 * Busca una penalizacion usando como ejemplo la pasada por parametro
	 * @param ejemplo Patron por el cual se buscara la penalizacion
	 * @return Lista de penalizaciones que coincidan con el ejemplo
	 * @throws Exception En caso de no poder concretarse la accion
	 */
	public List<Penalizacion> buscar (Penalizacion ejemplo) throws Exception {
//		return DAO.buscar(ejemplo);
		throw new ServiceException("Metodo buscar no implementado");
	}

	/**
	 * Obtiene una lista con todas las penalizaciones vencidas, es decir las que ya paso la fecha limite
	 * @return Lista de penalizaciones vencidas
	 * @throws Exception En caso de no poder concretarse la accion
	 */
	public List<Penalizacion> vencidas() throws Exception{
		return DAO.vencidas();
	}
	
	/**
	 * Elimina una penalizacion
	 * @param penalizacion Penalizacion a eliminar
	 * @return true en caso de exito, false en caso contrario
	 * @throws Exception En caso de no poder concretarse la accion
	 */
	public boolean eliminar(Penalizacion penalizacion)  throws Exception{
		return DAO.eliminar(penalizacion);
	}
	
	/**
	 * Verifica si un usuario esta penalizado
	 * @param usuario Usuario que se desea consultar si esta penalizado
	 * @return Objeto Penalizacion que contiene los datos de la penalizacion, null en caso de no estar penalizado
	 * @throws Exception En caso de no poder concretarse al accion
	 */
	public Penalizacion penalizado(Usuario usuario) throws Exception {
		return DAO.penalizado(usuario);
	}
}
